Java final 与 C++ const
全部标签 我需要一种方法来为我当前正在处理的程序初始化数组的const元素。问题是我必须用一个函数来初始化这些元素,没有办法这样做:constintarray[255]={1,1278632,188,...};因为我必须生成大量数据。我尝试将memcpy数据保存到constint中,但这不起作用,也没有起作用。constintarray[255];voidgenerateData(){for(inti=0;i我希望你明白我在尝试什么,对不起,如果我重复了这个问题,我一定忽略了它。 最佳答案 这个怎么样?#includetypedefstd::
我需要一种方法来为我当前正在处理的程序初始化数组的const元素。问题是我必须用一个函数来初始化这些元素,没有办法这样做:constintarray[255]={1,1278632,188,...};因为我必须生成大量数据。我尝试将memcpy数据保存到constint中,但这不起作用,也没有起作用。constintarray[255];voidgenerateData(){for(inti=0;i我希望你明白我在尝试什么,对不起,如果我重复了这个问题,我一定忽略了它。 最佳答案 这个怎么样?#includetypedefstd::
classFoo{intBar;public:int&GetBar()const{returnBar;}}GetBar是const方法可以吗?它实际上并没有改变任何东西,但它为“外部世界”提供了一种改变它的方法。 最佳答案 您的代码中有错字,这可能是您的意思:classFoo{intBar;public:int&GetBar()const{returnBar;//Removedtheampersand,becauseareferenceisreturned,notanaddress}}不,这是不合法的。当用const标记方法时,你不
classFoo{intBar;public:int&GetBar()const{returnBar;}}GetBar是const方法可以吗?它实际上并没有改变任何东西,但它为“外部世界”提供了一种改变它的方法。 最佳答案 您的代码中有错字,这可能是您的意思:classFoo{intBar;public:int&GetBar()const{returnBar;//Removedtheampersand,becauseareferenceisreturned,notanaddress}}不,这是不合法的。当用const标记方法时,你不
所以thisanswer让我想到了将new的结果分配给指向const的指针的场景。AFAIK,在这种情况下,您没有理由不能合法const_castconstness并实际修改对象:structX{intx;};//....constX*x=newX;const_cast(x)->x=0;//okay但后来我想-如果你真的想要new创建一个const对象怎么办。所以我尝试了structX{};//....constX*x=newconstX;它编译好了!!!这是GCC扩展还是标准行为?我在实践中从未见过这种情况。如果它是标准的,我会尽可能开始使用它。 最佳答案
所以thisanswer让我想到了将new的结果分配给指向const的指针的场景。AFAIK,在这种情况下,您没有理由不能合法const_castconstness并实际修改对象:structX{intx;};//....constX*x=newX;const_cast(x)->x=0;//okay但后来我想-如果你真的想要new创建一个const对象怎么办。所以我尝试了structX{};//....constX*x=newconstX;它编译好了!!!这是GCC扩展还是标准行为?我在实践中从未见过这种情况。如果它是标准的,我会尽可能开始使用它。 最佳答案
在VS2015和VS2017上,编译时没有警告,并生成无法捕获的访问冲突并使应用程序崩溃。显然int0被静默转换为空指针,然后假定它指向一个字符串,因此崩溃。#include#includevoidcrash(conststd::string&s){}intmain(){try{crash(0);}catch(conststd::exception&ex){//nevergetshere!std::cout如何捕获此类异常并从中恢复?如果我从函数参数中删除const它不会编译-所以这可能是防止用户滥用的一种方法,但我会失去const提供的保护,还是会?编写避免此问题的原型(protot
在VS2015和VS2017上,编译时没有警告,并生成无法捕获的访问冲突并使应用程序崩溃。显然int0被静默转换为空指针,然后假定它指向一个字符串,因此崩溃。#include#includevoidcrash(conststd::string&s){}intmain(){try{crash(0);}catch(conststd::exception&ex){//nevergetshere!std::cout如何捕获此类异常并从中恢复?如果我从函数参数中删除const它不会编译-所以这可能是防止用户滥用的一种方法,但我会失去const提供的保护,还是会?编写避免此问题的原型(protot
我的代码相当于以下内容:constint*constn=newint;printf("input:");scanf("%d",n);deleten;现在,由于n是一个指向CONSTANT整数的指针,这应该不起作用(我期待编译器错误)。但是,这似乎可以正常工作,甚至将输入的值存储到*n中。我想知道,为什么这不会给我一个错误;为什么它起作用?scanf不应该不能改变*n的值吗? 最佳答案 scanf的原型(prototype)是:intscanf(constchar*format,...);省略号表示它接受可变参数。C(和C++)没有办
我的代码相当于以下内容:constint*constn=newint;printf("input:");scanf("%d",n);deleten;现在,由于n是一个指向CONSTANT整数的指针,这应该不起作用(我期待编译器错误)。但是,这似乎可以正常工作,甚至将输入的值存储到*n中。我想知道,为什么这不会给我一个错误;为什么它起作用?scanf不应该不能改变*n的值吗? 最佳答案 scanf的原型(prototype)是:intscanf(constchar*format,...);省略号表示它接受可变参数。C(和C++)没有办